
// do while循环、5道练习题
#include<stdio.h>
#include<string.h> // 调用strlen()、strcmp()函数使用
#include<windows.h> // 调用Sleep()函数使用
#include <stdlib.h> // 调用rand()函数使用
#include <time.h> // 调用time()函数使用
//---------------------------------------------小节分割线--------------------------------------------
// do while 循环
// 循环至少执行一次，根据不同场景使用
// int main()
// {
//     int i = 1;
//     do
//     {
//         printf("%d\n", i);
//         i++;
//     }while(i<11);
//     return 0;
// }
//---------------小分割线 >.< --------------------
// do while 循环中的break和continue
// 用法和之前一样，不多BB
// int main()
// {
//     int i = 1;
//     do
//     {
//         if (i == 5)
//             //break;
//             continue;

//         printf("%d\n", i);
//         i++;
//     }while(i<11);
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
// 练习
// 看个p的讲解思路！写完后再看！
//1. 计算 n的阶乘。
// int JieCheng(int n)
// 用来计算阶乘时调用
// {
//     if (n != 0)
//     {
//         return (n * JieCheng(n-1));
//         // n! = n*(n-1)!  所以可以使用递归的方式编写，我调用我自己
//     }
//     else
//     {
//         return 1;
//         // 0! = 1，这也是递归结束的标志
//     }
// }
// int main()
// {
//     int n = 0; // 用来获取需要计算的值
//     long n_jie_cheng = 0;
//     scanf("%d", &n);
//     n_jie_cheng = JieCheng(n);

//     printf("%d", n_jie_cheng); 
//     return 0;
// }
// int main() // 或者不用递归方式，直接使用while循环
// {
//     int n = 0; // 用来获取需要计算的值
//     long n_jie_cheng = 1;
//     scanf("%d", &n);
//     while (n>0)
//     {
//         n_jie_cheng *= n;
//         n--;
//     }
//     printf("%d", n_jie_cheng); 
//     return 0;
// }
//---------------小分割线 >.< --------------------
//2. 计算 1!+2!+3!+……+10!
// int main()
// {
//     int n = 0; // 用来获取需要计算的值
//     long sum_jie_cheng = 0;
//     for (n = 1; n < 11; n++)
//     {
//         sum_jie_cheng += JieCheng(n);
//     }
//     printf("%d\n", sum_jie_cheng); 
//     return 0;
// }
//---------------小分割线 >.< --------------------
//3. 在一个有序数组中查找具体的某个数字n。（讲解二分查找）
// 有难度，可以跟着课程P38的37:31~63:00之间观看讲解过程
// 可以多编写几次
// int main()
// {
//     int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//     int k = 7; // 要查找的目标数字
//     int sz = sizeof(arr) / sizeof(arr[0]); // 确定数组的元素个数
//     int l_xb = 0; // 数组下标的左侧和右侧，先初始化为数组的最左和最右
//     int r_xb = sz-1; // 两个下标之后会随着查找不断更新
    
//     while (l_xb <= r_xb) // 只要左右两个下标不相等，说明还没有找到，需要继续循环
//     {
//         int m_xb = (l_xb + r_xb)/2; // 中间的下标
//         if (arr[m_xb] < k)
//         {
//             l_xb = m_xb + 1;
//         }
//         else if (arr[m_xb] > k)
//         {
//             r_xb = m_xb - 1;
//         }
//         else
//         {
//             printf("数字%d在数组中的位置是%d\n",k,m_xb);
//             break;
//         }
//     }
//     if (l_xb > r_xb)
//     {
//         printf("找不到\n");
//     }
//     return 0;
// }

//---------------------------------------------小节分割线--------------------------------------------
//4. 编写代码，演示多个字符从两端移动，向中间汇聚。
// 代码效果：以下内容逐行打印
// W###############!
// We#############!!
// Wel########### !!
// 中间省略……
// Welcome to CyberPunk 2077 !!

// int main()
// {
//     char arr1[] = "Welcome to CyberPunk 2077 !!";
//     char arr2[] = "############################";
//     int left = 0;
//     //int right = sizeof(arr1)-2;
//     int right = strlen(arr1)-1; // 如果用strlen就不会计算到最后\0的长度
    
//     while (left <= right)
//     {
//         printf("%s\n", arr2);
//         Sleep(300); // 单位是毫秒，相当于中间间隔0.3秒执行一次，注意S是大写
//         arr2[left] = arr1[left];
//         arr2[right] = arr1[right];
//         left++;
//         right--;
//     }
//     printf("%s\n", arr2); // 这里还要打印一次，是因为最后跳出循环的时候，虽然left已经比right大了
//     // 但是更新后的arr2还没有被打印
//     return 0;
// }
//---------------小分割线 >.< --------------------
// 5. 编写代码实现，模拟用户登录情景，并且只能登录三次。
// 只允许输入三次密码，如果密码正确则提示登录成功，如果三次均输入错误，则退出程序。
// int main()
// {
//     char psw[10] = ""; // 需要输入的密码
//     int i = 0; // 确定能输入的次数
//     for(i = 0; i < 3; i++)
//     {
//         printf("来吧输密码吧弟弟：>\n");
//         scanf("%s",psw); // psw是数组名，数组名本来就是地址，所以前面不需要加&
//         //if(psw == "123asd")// 这样比较是错误的，字符串不能用==比较，要用函数strcmp
//         // 这样直接写psw == "123asd" ，其实是在比较两个字符串中，首个字符的地址，所以肯定不一样
//         if(strcmp(psw, "123asd") == 0) // 需要注意，如果两个字符串一样，返回值是0而不是1
//         {
//             i = 0; // 如果输入正确，令i等于0并且跳出循环
//             break;
//         }
//         else
//         {
//             printf("啊不对不对不对,已经输错%d次了\n", i+1);
//             continue;
//         }
//     }
//     if (i == 0)
//     {
//         printf("啊对对对进去吧!\n");
//     }
//     else
//     {
//         printf("蒙错3次了吧弟弟,回家吧\n");
//     }
//     return 0;
// }
//---------------小分割线 >.< --------------------
// 6.猜数字游戏
// 自动产生一个1-100之间的随机数，玩家猜测数字大小
// 你猜错了，会告诉猜大了，还是猜小了，继续猜，直到猜对
// 游戏可以一直玩，除非退出游戏
void menu()
{
 printf("***********************************\n");
 printf("*********** 1.玩游戏！   **********\n");
 printf("*********** 0.玩个屁！   **********\n");
 printf("***********************************\n");
}
void game()
{
    // srand 函数用来根据一个种子生存一个随机数
    // 随机数种子可以使用时间戳time(NULL)
    // time 函数返回类型为time_t的一个自定义的整形类型，
    // 将time_t强制转化为unsigned int类型，就可以给srand函数使用了
    // rand 函数返回一个0~32767之间的数字
    
    int random_num = rand()%100+1;
    printf("%d\n",random_num);
    int guess_num = 0; // 猜测的数字
    do
    {
        printf("来吧猜个1~100的数字吧:\n");
        scanf("%d", &guess_num);
        if (guess_num > random_num)
        {
            printf("太大了太大了你行不行啊\n");
        }
        else if(guess_num < random_num)
        {
            printf("太小了太小了你是真的不行啊\n");
        }
        else
        {
            printf("卧槽牛逼猜对了就是%d没错!\n", random_num);
            printf("现在就返回菜单,好兄弟再来一局不?\n\n");
            break;
        }
    }while (1); 
}
int main()
{
    int wbw = 1; // 用来判断玩家玩不玩
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("来来来好兄弟要不要玩耍?(1/0)>\n");
        scanf("%d", &wbw);
        switch (wbw)
        {
            case 0:
            {
                printf("不玩算逑再见吧您\n");
                break;
            }
            case 1:
            {
                game();
                continue; // 用来跳过之后default的内容
            }
            default:
            {
                printf("好好看看你到底是1还是0?再输一遍！\n");
                wbw = 1;
            }
        }
    }while (wbw == 1);
    
    return 0;
}